package com.csg.service.impl;

import com.csg.entity.Resources;
import com.csg.mapper.ResourcesMapper;
import com.csg.mapper.RoleMapper;
import com.csg.model.vo.MenuVO;
import com.csg.service.IResourcesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 菜单资源表 服务实现类
 * </p>
 *
 * @author George Chan
 * @since 2020-02-06
 */
@Service
public class ResourcesServiceImpl extends ServiceImpl<ResourcesMapper, Resources> implements IResourcesService {
    @Autowired
    private RoleMapper roleMapper;

    @Override
    public List<MenuVO> listMenus() {
        // 最后返回的list数据集合
        List<MenuVO> result;

        List<MenuVO> menuVOS = this.baseMapper.getMenuList();
        // 构建树
        result = buildTree(menuVOS);
        return result;
    }

    /**
     * 构建菜单树形结构
     * @param menuVOS 菜单数据集合
     * @return 返回属性结构对象
     */
    private List<MenuVO> buildTree(List<MenuVO> menuVOS) {
        List<MenuVO> treeMenus = Lists.newArrayList();
        for (MenuVO menu : getRobotNode(menuVOS)) {
            menu = buildChildTree(menu, menuVOS);
            treeMenus.add(menu);
        }
        return treeMenus;
    }

    /**
     * 递归获取子级数据
     * @param pNode 父节点数据
     * @param list 所有数据集合
     * @return 返回组装好子节点数据的父节点
     */
    private MenuVO buildChildTree(MenuVO pNode, List<MenuVO> list) {
        List<MenuVO> childMenus = Lists.newArrayList();
        for (MenuVO menu : list) {
            if (StringUtils.equals(menu.getParentId(), pNode.getId())) {
                childMenus.add(buildChildTree(menu, list));
            }
        }
        pNode.setChildren(childMenus);
        return pNode;
    }

    /**
     * 获取第一级数据集合
     * @param menuVOS 所有数据集合
     * @return 第一级数据集合
     */
    private List<MenuVO> getRobotNode(List<MenuVO> menuVOS) {
        List<MenuVO> rootMenuList = Lists.newArrayList();
        for (MenuVO menu : menuVOS) {
            if (StringUtils.isEmpty(menu.getParentId())) {
                rootMenuList.add(menu);
            }
        }
        return rootMenuList;
    }

}
